/*
 * Material Icons 元数据生成脚本
 * 
 * 功能：
 * 1. 从 Google Fonts API 获取最新的 Material Icons 数据
 * 2. 从本地 @mdi/svg 包获取 MDI 图标数据
 * 3. 合并两个图标库，生成统一的图标元数据文件
 * 4. 支持离线使用，适合内网环境
 * 
 * 使用方法：
 * 1. 确保已安装 @mdi/svg: yarn add @mdi/svg
 * 2. 运行脚本: node generate-icon-metadata.js
 * 3. 生成的文件: src/assets/metadata/material-icons.json
 * 
 * 重要变更说明：
 * - 2025-10-19: 修改为使用本地 JSON 文件替代 Google Fonts API
 * - 原因: 支持内网环境，避免网络访问限制
 * - 数据源: 使用 generate-icons-api.json 文件（手动下载的 API 响应）
 * - 兼容性: 保持原有的数据处理逻辑不变
 */
const fs = require('fs');
const path = require('path');

// 配置路径
const materialIconDir = path.join('.', 'src', 'assets', 'metadata');  // 输出目录
const mdiMetadata = path.join('.', 'node_modules', '@mdi', 'svg', 'meta.json');  // MDI 元数据文件

/**
 * 主函数：初始化图标元数据生成流程
 */
async function init() {
  // 读取现有的图标数据文件
  const iconsBundle = JSON.parse(await fs.promises.readFile(path.join(materialIconDir, 'material-icons.json')));

  // 更新 Material Icons 数据
  await getMaterialIconMetadataAndUpdated(iconsBundle);
  // 更新 MDI Icons 数据
  await getMDIMetadataAndUpdated(iconsBundle);

  // 保存更新后的图标数据
  await fs.promises.writeFile(path.join(materialIconDir, 'material-icons.json'), JSON.stringify(iconsBundle), 'utf8')
}

/**
 * 获取并更新 Material Icons 元数据
 * 
 * 功能：
 * 1. 从 Google Fonts API 获取最新的 Material Icons 数据
 * 2. 过滤掉不支持 Material Icons 的图标
 * 3. 去重处理，避免重复图标
 * 4. 智能插入新图标，保持原有顺序
 * 5. 更新图标的标签信息
 * 
 * @param {Array} iconsBundle - 现有的图标数据数组
 */
async function getMaterialIconMetadataAndUpdated(iconsBundle){
  // 从 Google Fonts API 获取图标数据（已注释，使用本地文件）
  // const iconsResponse = await fetch('https://fonts.google.com/metadata/icons?key=material_symbols&incomplete=true');
  // const iconsText = await iconsResponse.text();
  
  // 从本地 JSON 文件获取图标数据（替代 Google Fonts API）
  const iconsText = await fs.promises.readFile(path.join('.', 'generate-icons-api.json'), 'utf8');


  // 处理 API 响应：去掉第一行（通常是注释）
  const clearText = iconsText.substring(iconsText.indexOf("\n") + 1);

  const icons = JSON.parse(clearText).icons;

  // 去重处理：过滤掉重复的图标和不支持 Material Icons 的图标
  let prevItem;
  const filterIcons = icons.filter((item) => {
    if (prevItem?.name !== item.name && !item.unsupported_families.includes('Material Icons')) {
      prevItem = item;
      return true;
    }
    return false;
  });

  // 处理每个图标
  filterIcons.forEach((item, index) => {
    const findItem = iconsBundle.find((el) => el.name === item.name);
    if (!findItem) {
      // 新图标：需要插入到合适的位置
      let prevIndexIcon = 0;
      if (index === 0) {
        // 第一个图标：插入到位置 45（Material Icons 开始位置）
        prevIndexIcon = 45;
      } else {
        // 其他图标：找到前一个图标的位置
        let iteration = 0;
        while (prevIndexIcon < 45) {
          iteration++;
          const prevIconName = filterIcons[index - iteration].name;
          prevIndexIcon = findPreviousIcon(iconsBundle, prevIconName);
        }
      }
      // 插入新图标
      if (prevIndexIcon >= 0) {
        iconsBundle.splice(prevIndexIcon + 1, 0, {name:item.name, tags:item.tags});
      }
      console.log('Not found icon:', item.name);
      console.count('Not found material icon');
      return;
    }
    // 现有图标：检查标签是否需要更新
    if (JSON.stringify(item.tags) !== JSON.stringify(findItem.tags)) {
      findItem.tags = item.tags;
      console.log('Difference tags in', item.name);
      console.count('Difference tags in material icon');
    }
  });
}

/**
 * 获取并更新 MDI Icons 元数据
 * 
 * 功能：
 * 1. 从本地 @mdi/svg 包读取 MDI 图标元数据
 * 2. 清理不存在的 MDI 图标
 * 3. 处理图标的别名和标签
 * 4. 智能插入新图标，保持原有顺序
 * 5. 更新图标的标签信息
 * 
 * @param {Array} iconsBundle - 现有的图标数据数组
 */
async function getMDIMetadataAndUpdated(iconsBundle){
  // 从本地 @mdi/svg 包读取元数据
  const mdiBundle = JSON.parse(await fs.promises.readFile(mdiMetadata));

  // 第一步：清理不存在的 MDI 图标
  iconsBundle
    .filter(item => item.name.startsWith('mdi:'))
    .forEach(item => {
      const iconName = item.name.substring(item.name.indexOf(":") + 1);
      const findItem = mdiBundle.find((el) => el.name === iconName);
      if (!findItem) {
        console.error('Delete icon:', item.name);
      }
    });

  // 第二步：处理每个 MDI 图标
  mdiBundle.forEach((item, index) => {
    const iconName = `mdi:${item.name}`
    // 处理标签：合并原始标签和别名
    let iconTags = item.tags;
    const iconAliases = item.aliases.map(item => item.replaceAll('-', ' '));
    if (!iconTags.length && item.aliases.length)  {
      // 如果没有标签但有别名，使用别名作为标签
      iconTags = iconAliases;
    } else if (item.aliases.length) {
      // 如果有标签和别名，合并两者
      iconTags = iconTags.concat(iconAliases);
    }
    // 标签转小写
    iconTags = iconTags.map(item => item.toLowerCase());

    const findItem = iconsBundle.find((el) => el.name === iconName);
    if (!findItem) {
      // 新图标：需要插入到合适的位置
      let prevIndexIcon;
      if (index === 0) {
        // 第一个图标：找到第一个 MDI 图标的位置
        prevIndexIcon = iconsBundle.findIndex(item => item.name.startsWith('mdi:'))
      } else {
        // 其他图标：找到前一个图标的位置
        const prevIconName = `mdi:${mdiBundle[index - 1].name}`;
        prevIndexIcon = findPreviousIcon(iconsBundle, prevIconName);
      }
      // 插入新图标
      if (prevIndexIcon >= 0) {
        iconsBundle.splice(prevIndexIcon + 1, 0, {name:iconName, tags:iconTags});
      }
      console.log('新增图标:', iconName);
      console.count('新增的 MDI 图标');
      return;
    }
    // 现有图标：检查标签是否需要更新
    if (JSON.stringify(iconTags) !== JSON.stringify(findItem.tags)) {
      findItem.tags = iconTags;
      console.log('更新图标:', iconName);
      console.count('更新的 MDI 图标');
    }
  });
}

/**
 * 查找指定图标在图标数组中的索引位置
 * 
 * 功能：
 * 在图标数组中查找指定名称的图标，返回其索引位置
 * 如果找不到，返回 -1
 * 
 * @param {Array} iconsBundle - 图标数据数组
 * @param {string} findName - 要查找的图标名称
 * @returns {number} 图标的索引位置，找不到返回 -1
 */
function findPreviousIcon(iconsBundle, findName) {
  return iconsBundle.findIndex(item => item.name === findName);
}

// 启动脚本
init();
